home *** CD-ROM | disk | FTP | other *** search
- /*
- contributed by Mimir Reynisson <skelmir@qualia.com>
-
- virtual memory must be turned off, just as with MkLinux and BeOS
- */
-
- #include "garymode.h"
-
- static UInt16 __68ksupervisorglue[] =
- {
- 0x46FC, 0x2700, // MOVE #$2700,SR
- 0x266F, 0x0004, // MOVEA.L $0004(A7),A3
- 0x200F, // MOVE.L A7,D0
- 0x0240, 0xFC00, // ANDI.W #$FC00,D0
- 0x2E40, // MOVEA.L D0,A7
- 0x303C, 0x00BF, // MOVE.W #$00BF,D0
- 0x42A7, // CLR.L -(A7)
- 0x51C8, 0xFFFC, // DBF D0,*-$0002 ; 00000014
- 0x2F6B, 0x0000, 0x00FC, // MOVE.L $0000(A3),$00FC(A7) PC
- 0x2F6B, 0x0004, 0x0104, // MOVE.L $0004(A3),$0104(A7) GPR[0]
- 0x200F, // MOVE.L A7, D0
- 0x2F40, 0x010C, // MOVE.L D0,$010C(A7)
- 0x2F6B, 0x0008, 0x010C, // MOVE.L $0008(A3),$010C(A7) GPR[1]
- 0x2F6B, 0x000C, 0x0114, // MOVE.L $000C(A3),$0114(A7)
- 0x2F6B, 0x0010, 0x011C, // MOVE.L $0010(A3),$011C(A7)
- 0x2F6B, 0x0014, 0x0124, // MOVE.L $0014(A3),$0124(A7)
- 0x2F6B, 0x0018, 0x012C, // MOVE.L $0018(A3),$012C(A7)
- 0x2F6B, 0x001C, 0x0134, // MOVE.L $001C(A3),$0134(A7)
- 0x2F6B, 0x0020, 0x013C, // MOVE.L $0020(A3),$013C(A7)
- 0x2F6B, 0x0024, 0x0144, // MOVE.L $0024(A3),$0144(A7)
- 0x2F6B, 0x0028, 0x014C, // MOVE.L $0028(A3),$014C(A7)
- 0x2F6B, 0x002C, 0x0154, // MOVE.L $002C(A3),$0154(A7)
- 0x2F6B, 0x0030, 0x015C, // MOVE.L $0030(A3),$015C(A7)
- 0x2F6B, 0x0034, 0x0164, // MOVE.L $0034(A3),$0164(A7)
- 0x2F6B, 0x0038, 0x016C, // MOVE.L $0038(A3),$016C(A7)
- 0x2F6B, 0x003C, 0x0174, // MOVE.L $003C(A3),$0174(A7)
- 0x2F6B, 0x0040, 0x017C, // MOVE.L $0040(A3),$017C(A7)
- 0x2F6B, 0x0044, 0x0184, // MOVE.L $0044(A3),$0184(A7)
- 0x2F6B, 0x0048, 0x018C, // MOVE.L $0048(A3),$018C(A7)
- 0x2F6B, 0x004C, 0x0194, // MOVE.L $004C(A3),$0194(A7)
- 0x2F6B, 0x0050, 0x019C, // MOVE.L $0050(A3),$019C(A7)
- 0x2F6B, 0x0054, 0x01A4, // MOVE.L $0054(A3),$01A4(A7)
- 0x2F6B, 0x0058, 0x01AC, // MOVE.L $0058(A3),$01AC(A7)
- 0x2F6B, 0x005C, 0x01B4, // MOVE.L $005C(A3),$01B4(A7)
- 0x2F6B, 0x0060, 0x01BC, // MOVE.L $0060(A3),$01BC(A7)
- 0x2F6B, 0x0064, 0x01C4, // MOVE.L $0064(A3),$01C4(A7)
- 0x2F6B, 0x0068, 0x01CC, // MOVE.L $0068(A3),$01CC(A7)
- 0x2F6B, 0x006C, 0x01D4, // MOVE.L $006C(A3),$01D4(A7)
- 0x2F6B, 0x0070, 0x01DC, // MOVE.L $0070(A3),$01DC(A7)
- 0x2F6B, 0x0074, 0x01E4, // MOVE.L $0074(A3),$01E4(A7)
- 0x2F6B, 0x0078, 0x01EC, // MOVE.L $0078(A3),$01EC(A7)
- 0x2F6B, 0x007C, 0x01F4, // MOVE.L $007C(A3),$01F4(A7)
- 0x2F6B, 0x0080, 0x01FC, // MOVE.L $0080(A3),$01FC(A7)
- 0x2F6B, 0x0084, 0x0200, // MOVE.L $0084(A3),$0200(A7)
- 0x2F6B, 0x0088, 0x0204, // MOVE.L $0088(A3),$0204(A7)
- 0x2F6B, 0x008C, 0x0208, // MOVE.L $008C(A3),$0208(A7)
- 0x2F6B, 0x0090, 0x020C, // MOVE.L $0090(A3),$020C(A7)
- 0x2F6B, 0x0094, 0x0210, // MOVE.L $0094(A3),$0210(A7)
- 0x2F6B, 0x0098, 0x0214, // MOVE.L $0098(A3),$0214(A7)
- 0x2F6B, 0x009C, 0x0218, // MOVE.L $009C(A3),$0218(A7)
- 0x2F6B, 0x00A0, 0x021C, // MOVE.L $00A0(A3),$021C(A7)
- 0x2F6B, 0x00A4, 0x0220, // MOVE.L $00A4(A3),$0220(A7)
- 0x2F6B, 0x00A8, 0x0224, // MOVE.L $00A8(A3),$0224(A7)
- 0x2F6B, 0x00AC, 0x0228, // MOVE.L $00AC(A3),$0228(A7)
- 0x2F6B, 0x00B0, 0x022C, // MOVE.L $00B0(A3),$022C(A7)
- 0x2F6B, 0x00B4, 0x0230, // MOVE.L $00B4(A3),$0230(A7)
- 0x2F6B, 0x00B8, 0x0234, // MOVE.L $00B8(A3),$0234(A7)
- 0x2F6B, 0x00BC, 0x0238, // MOVE.L $00BC(A3),$0238(A7)
- 0x2F6B, 0x00C0, 0x023C, // MOVE.L $00C0(A3),$023C(A7)
- 0x2F6B, 0x00C4, 0x0240, // MOVE.L $00C4(A3),$0240(A7)
- 0x2F6B, 0x00C8, 0x0244, // MOVE.L $00C8(A3),$0244(A7)
- 0x2F6B, 0x00CC, 0x0248, // MOVE.L $00CC(A3),$0248(A7)
- 0x2F6B, 0x00D0, 0x024C, // MOVE.L $00D0(A3),$024C(A7)
- 0x2F6B, 0x00D4, 0x0250, // MOVE.L $00D4(A3),$0250(A7)
- 0x2F6B, 0x00D8, 0x0254, // MOVE.L $00D8(A3),$0254(A7)
- 0x2F6B, 0x00DC, 0x0258, // MOVE.L $00DC(A3),$0258(A7)
- 0x2F6B, 0x00E0, 0x025C, // MOVE.L $00E0(A3),$025C(A7)
- 0x2F6B, 0x00E4, 0x0260, // MOVE.L $00E4(A3),$0260(A7)
- 0x2F6B, 0x00E8, 0x0264, // MOVE.L $00E8(A3),$0264(A7)
- 0x2F6B, 0x00EC, 0x0268, // MOVE.L $00EC(A3),$0268(A7)
- 0x2F6B, 0x00F0, 0x026C, // MOVE.L $00F0(A3),$026C(A7)
- 0x2F6B, 0x00F4, 0x0270, // MOVE.L $00F4(A3),$0270(A7)
- 0x2F6B, 0x00F8, 0x0274, // MOVE.L $00F8(A3),$0274(A7)
- 0x2F6B, 0x00FC, 0x0278, // MOVE.L $00FC(A3),$0278(A7)
- 0x2F6B, 0x0100, 0x027C, // MOVE.L $0100(A3),$027C(A7)
- 0x2F6B, 0x0104, 0x0280, // MOVE.L $0104(A3),$0280(A7)
- 0x2F6B, 0x0108, 0x0284, // MOVE.L $0108(A3),$0284(A7)
- 0x2F6B, 0x010C, 0x0288, // MOVE.L $010C(A3),$0288(A7)
- 0x2F6B, 0x0110, 0x028C, // MOVE.L $0110(A3),$028C(A7)
- 0x2F6B, 0x0114, 0x0290, // MOVE.L $0114(A3),$0290(A7)
- 0x2F6B, 0x0118, 0x0294, // MOVE.L $0118(A3),$0294(A7)
- 0x2F6B, 0x011C, 0x0298, // MOVE.L $011C(A3),$0298(A7)
- 0x2F6B, 0x0120, 0x029C, // MOVE.L $0120(A3),$029C(A7)
- 0x2F6B, 0x0124, 0x02A0, // MOVE.L $0124(A3),$02A0(A7)
- 0x2F6B, 0x0128, 0x02A4, // MOVE.L $0128(A3),$02A4(A7)
- 0x2F6B, 0x012C, 0x02A8, // MOVE.L $012C(A3),$02A8(A7)
- 0x2F6B, 0x0130, 0x02AC, // MOVE.L $0130(A3),$02AC(A7)
- 0x2F6B, 0x0134, 0x02B0, // MOVE.L $0134(A3),$02B0(A7)
- 0x2F6B, 0x0138, 0x02B4, // MOVE.L $0138(A3),$02B4(A7)
- 0x2F6B, 0x013C, 0x02B8, // MOVE.L $013C(A3),$02B8(A7)
- 0x2F6B, 0x0140, 0x02BC, // MOVE.L $0140(A3),$02BC(A7)
- 0x2F6B, 0x0144, 0x02C0, // MOVE.L $0144(A3),$02C0(A7)
- 0x2F6B, 0x0148, 0x02C4, // MOVE.L $0148(A3),$02C4(A7)
- 0x2F6B, 0x014C, 0x02C8, // MOVE.L $014C(A3),$02C8(A7)
- 0x2F6B, 0x0150, 0x02CC, // MOVE.L $0150(A3),$02CC(A7)
- 0x2F6B, 0x0154, 0x02D0, // MOVE.L $0154(A3),$02D0(A7)
- 0x2F6B, 0x0158, 0x02D4, // MOVE.L $0158(A3),$02D4(A7)
- 0x2F6B, 0x015C, 0x02D8, // MOVE.L $015C(A3),$02D8(A7)
- 0x2F6B, 0x0160, 0x02DC, // MOVE.L $0160(A3),$02DC(A7)
- 0x2F6B, 0x0164, 0x02E0, // MOVE.L $0164(A3),$02E0(A7)
- 0x2F6B, 0x0168, 0x02E4, // MOVE.L $0168(A3),$02E4(A7)
- 0x2F6B, 0x016C, 0x02E8, // MOVE.L $016C(A3),$02E8(A7)
- 0x2F6B, 0x0170, 0x02EC, // MOVE.L $0170(A3),$02EC(A7)
- 0x2F6B, 0x0174, 0x02F0, // MOVE.L $0174(A3),$02F0(A7)
- 0x2F6B, 0x0178, 0x02F4, // MOVE.L $0178(A3),$02F4(A7)
- 0x2F6B, 0x017C, 0x02F8, // MOVE.L $017C(A3),$02F8(A7)
- 0x2F6B, 0x0180, 0x02FC, // MOVE.L $0180(A3),$02FC(A7)
- 0x207C, 0x4761, 0x7279, // MOVEA.L #$47617279,A0 ; 'Gary'
- 0x227C, 0x0505, 0x1956, // MOVEA.L #$05051956,A1
- 0x203C, 0x0000, 0xC000, // MOVE.L #$0000C000,D0
- 0x7400, // MOVEQ #$00,D2
- 0x4E70,
- 0x2F0F, // MOVE.L A7,-(A7)
- 0xFE03, // DC.W $FE03 ; ????
- 0x67FC, // BEQ.S *-$0002 ; 00000276
- 0x4E75 // RTS
- };
-
- typedef struct PPCRegisterList PPCRegisterList;
-
- typedef void (*__68KSupervisorGlueProcPtr)(PPCRegisterList* regList);
-
- typedef UniversalProcPtr __68KSupervisorGlueUPP;
-
- enum {
- upp68KSupervisorGlueProcInfo = kCStackBased
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(PPCRegisterList*)))
- };
-
- #define New68KSupervisorGlueProc(userRoutine) \
- (__68KSupervisorGlueUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), upp68KSupervisorGlueProcInfo, kM68kISA)
-
- #define Call68KSupervisorGlueProc(userRoutine, regList) \
- CallUniversalProc((UniversalProcPtr)(userRoutine), upp68KSupervisorGlueProcInfo, (regList))
-
- static asm
- getCurrentSP(void)
- {
- mr r3, sp
- blr
- }
-
- void
- EnterPriviledgedMode(PriviledgedEntryPoint entryPoint,
- void *param1, void *param2, void *param3)
- {
- PPCRegisterList regList;
- static __68KSupervisorGlueUPP __68Kglue;
-
- if (__68Kglue == NULL)
- {
- __68Kglue = New68KSupervisorGlueProc(__68ksupervisorglue);
- }
- regList.PC = ((UInt32 *)entryPoint)[0];
- regList.GPR[1] = getCurrentSP();
- regList.GPR[2] = ((UInt32 *)entryPoint)[1];
- regList.GPR[3] = (UInt32)param1;
- regList.GPR[4] = (UInt32)param2;
- regList.GPR[5] = (UInt32)param3;
- Call68KSupervisorGlueProc(__68Kglue, ®List);
- }
-